package com.alvin.demo;

import com.alvin.demo.utils.ModbusRTURequestBuilder;
import com.alvin.demo.utils.NumberUtils;
import com.fazecast.jSerialComm.SerialPort;
import org.junit.Test;

public class TestRTU {
    @Test
    public void test01() throws InterruptedException {
        SerialPort serialPort = SerialPort.getCommPort("COM10"); // 串口设备名称
        serialPort.setBaudRate(9600); // 波特率
        serialPort.setNumDataBits(8); // 数据位
        serialPort.setParity(SerialPort.NO_PARITY); // 校验位
        serialPort.setNumStopBits(1); // 停止位

        if (serialPort.openPort()) {
            byte[] requestMessage = ModbusRTURequestBuilder.buildModbusRTURequest(
                    0,
                    3,
                    10,
                    2
            );
            // 读取数据
            serialPort.writeBytes(requestMessage, requestMessage.length);

            Thread.sleep(300); // 等待足够的时间以确保传感器响应

            byte[] responseData = new byte[100];
            // 获取响应
            int bytesRead = serialPort.readBytes(responseData, responseData.length);
            //转换为16进制
            System.out.println(NumberUtils.bytesToHexString(responseData , bytesRead));

            serialPort.closePort();
        } else {
            System.out.println("无法打开串口");
        }
    }

    // 写数据 写单个寄存器
    @Test
    public void test02() throws InterruptedException {
        SerialPort serialPort = SerialPort.getCommPort("COM10"); // 串口设备名称
        serialPort.setBaudRate(9600); // 波特率
        serialPort.setNumDataBits(8); // 数据位
        serialPort.setParity(SerialPort.NO_PARITY); // 校验位
        serialPort.setNumStopBits(1); // 停止位

        if (serialPort.openPort()) {
            byte[] requestMessage = ModbusRTURequestBuilder.buildModbusRTURequest(
                    0,
                    6,
                    155,
                    300
                    );
            serialPort.writeBytes(requestMessage, requestMessage.length);
            Thread.sleep(300);
            byte[] responseData = new byte[100];
            // 获取响应
            int bytesRead = serialPort.readBytes(responseData, responseData.length);
            //转换为16进制
            System.out.println(NumberUtils.bytesToHexString(responseData , bytesRead));
            serialPort.closePort();
        } else {
            System.out.println("无法打开串口");
        }
    }

    // 写入多个数据、修改时间
    @Test
    public void test03() throws InterruptedException {
        // 设置串口一些参数，除了串口号其他基本固定 COM2就是文章前配置的
        SerialPort serialPort = SerialPort.getCommPort("COM10"); // 串口设备名称
        serialPort.setBaudRate(9600); // 波特率
        serialPort.setNumDataBits(8); // 数据位
        serialPort.setParity(SerialPort.NO_PARITY); // 校验位
        serialPort.setNumStopBits(1); // 停止位
        if (serialPort.openPort()) {
            byte[] requestMessage = ModbusRTURequestBuilder.checkTime(
                    0);
            serialPort.writeBytes(requestMessage, requestMessage.length);
            Thread.sleep(500); // 等待足够的时间以确保传感器响应
            // 响应数据的长度根据以下公式自行调整
            //  从站地址(1) + 功能码(1) + 数据总长度(1) + 数据 + CRC校验(2)
            // 数据总长度20的原因：读取10个寄存器的数据，会返回*2的字节数
            byte[] responseData = new byte[100];
            // 获取响应
            int bytesRead = serialPort.readBytes(responseData, responseData.length);
            //转换为16进制
            System.out.println(NumberUtils.bytesToHexString(responseData , bytesRead));
            serialPort.closePort();
        } else {
            System.out.println("无法打开串口");
        }
    }

}